ИППРПО

Docker. Docker-compose

ИППРПО

План лекции

  • Введение в Docker Compose
  • Установка и настройка Docker Compose
  • Синтаксис и структура docker-compose.yml
  • Основные команды Docker Compose
  • Сервисы, сети и тома
  • Переменные окружения и конфигурация
  • Практические примеры приложений
  • Масштабирование и управление
  • Лучшие практики
  • Подведение итогов
Docker. Docker-compose
ИППРПО

Введение в Docker Compose

Docker Compose — это инструмент для определения и запуска многоконтейнерных Docker-приложений. Позволяет описать всю инфраструктуру приложения в одном файле.

Зачем нужен Docker Compose?

  • Упрощает управление многоконтейнерными приложениями
  • Обеспечивает воспроизводимость окружения
  • Автоматизирует запуск и остановку сервисов
  • Упрощает развертывание в различных окружениях
Docker. Docker-compose
ИППРПО

Преимущества Docker Compose

  • Декларативное описание: весь стек в одном файле
  • Простота использования: одна команда для запуска всего приложения
  • Изоляция окружений: разные файлы для dev/staging/prod
  • Управление зависимостями: автоматический порядок запуска
  • Сетевое взаимодействие: автоматическое создание сетей
  • Переменные окружения: гибкая конфигурация
Docker. Docker-compose
ИППРПО

Установка Docker Compose

Docker Compose уже включен в Docker Desktop для Windows и macOS.

Для Linux (отдельная установка):

# Скачивание последней версии
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# Установка прав
sudo chmod +x /usr/local/bin/docker-compose

# Проверка установки
docker-compose --version
Docker. Docker-compose
ИППРПО

Проверка версии

# Проверка версии Docker Compose
docker-compose --version
# Docker Compose version v2.20.0

# Проверка версии Docker Compose V2 (новая версия)
docker compose version
# Docker Compose version v2.20.0
Docker. Docker-compose
ИППРПО

Структура docker-compose.yml

version: '3.8'                    # Версия синтаксиса

services:                         # Определение сервисов
  web:                           # Имя сервиса
    image: nginx:alpine          # Используемый образ
    ports:                       # Проброс портов
      - "80:80"
    volumes:                     # Монтирование томов
      - ./html:/usr/share/nginx/html
    environment:                 # Переменные окружения
      - NGINX_HOST=localhost
    depends_on:                  # Зависимости
      - api

networks:                        # Определение сетей
  frontend:
  backend:

volumes:                         # Определение томов
  db_data:
Docker. Docker-compose
ИППРПО

Основные версии синтаксиса

Версия Год выпуска Особенности
1 2014 Устарела, не рекомендуется
2.x 2016 Поддержка сетей, томов
3.x 2017+ Масштабирование, деплойменты

Рекомендуется использовать версию 3.8 или выше

Docker. Docker-compose
ИППРПО

Сервисы (Services)

Сервис — это контейнер, запускаемый на основе образа.

services:
  web:
    image: nginx:alpine
    container_name: my-web-server
    restart: unless-stopped
    
  api:
    build: ./api              # Сборка из Dockerfile
    ports:
      - "3000:3000"
Docker. Docker-compose
ИППРПО

Способы указания образа

services:
  # Использование готового образа
  web:
    image: nginx:alpine
    
  # Сборка из Dockerfile
  api:
    build: .
    
  # Сборка с указанием контекста
  app:
    build:
      context: ./app
      dockerfile: Dockerfile.prod
      
  # Сборка с аргументами
  worker:
    build:
      context: .
      args:
        - BUILD_ENV=production
Docker. Docker-compose
ИППРПО

Порты и сети

services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"          # Проброс порта
      - "443:443"        # Можно указать несколько
      
  api:
    image: node:18
    expose:
      - "3000"           # Открытие порта только для других сервисов
    networks:
      - frontend
      - backend
Docker. Docker-compose
ИППРПО

Тома (Volumes)

services:
  db:
    image: postgres:15
    volumes:
      # Именованный том
      - db_data:/var/lib/postgresql/data
      
      # Bind mount (монтирование директории)
      - ./init-scripts:/docker-entrypoint-initdb.d
      
      # Только для чтения
      - ./config:/etc/postgresql:ro
      
      # Временный том
      - /tmp/cache

volumes:
  db_data:                # Определение именованного тома
Docker. Docker-compose
ИППРПО

Переменные окружения

services:
  web:
    image: node:18
    environment:
      # Простой формат
      - NODE_ENV=production
      - PORT=3000
      
      # Использование переменных окружения хоста
      - DATABASE_URL=${DATABASE_URL}
      
      # Значение по умолчанию
      - REDIS_URL=${REDIS_URL:-redis://localhost:6379}
Docker. Docker-compose
ИППРПО

Файл переменных окружения

.env файл:

DATABASE_URL=postgresql://user:pass@db:5432/myapp
REDIS_URL=redis://redis:6379
JWT_SECRET=my-secret-key
API_KEY=your-api-key

Испование в docker-compose.yml:

services:
  api:
    image: node:18
    env_file:
      - .env
      - .env.local
Docker. Docker-compose
ИППРПО

Зависимости между сервисами

services:
  db:
    image: postgres:15
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      
  api:
    image: node:18
    depends_on:
      - db              # API будет запущен после DB
      
  web:
    image: nginx:alpine
    depends_on:
      - api             # Web будет запущен после API
Docker. Docker-compose
ИППРПО

Управление ресурсами

services:
  api:
    image: node:18
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M
Docker. Docker-compose
ИППРПО

Перезапуск и мониторинг

services:
  api:
    image: node:18
    restart: unless-stopped    # Политика перезапуска
    
  web:
    image: nginx:alpine
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
Docker. Docker-compose
ИППРПО

Политики перезапуска

Политика Описание
no Не перезапускать (по умолчанию)
always Всегда перезапускать
on-failure Перезапускать при ошибке
unless-stopped Перезапускать, пока не остановлен вручную
Docker. Docker-compose
ИППРПО

Сети (Networks)

services:
  web:
    image: nginx:alpine
    networks:
      - frontend
      
  api:
    image: node:18
    networks:
      - frontend
      - backend
      
  db:
    image: postgres:15
    networks:
      - backend

networks:
  frontend:
  backend:
    driver: bridge
    internal: true    # Без доступа в интернет
Docker. Docker-compose
ИППРПО

Основные команды Docker Compose

# Запуск всех сервисов
docker-compose up

# Запуск в фоновом режиме
docker-compose up -d

# Остановка и удаление контейнеров
docker-compose down

# Просмотр логов
docker-compose logs

# Просмотр статуса
docker-compose ps
Docker. Docker-compose
ИППРПО

Команды управления

# Просмотр логов конкретного сервиса
docker-compose logs web

# Просмотр логов в реальном времени
docker-compose logs -f

# Перезапуск сервисов
docker-compose restart

# Пересборка образов
docker-compose build

# Пересборка и запуск
docker-compose up --build
Docker. Docker-compose
ИППРПО

Команды для работы с сервисами

# Запуск конкретного сервиса
docker-compose up web

# Масштабирование сервиса
docker-compose up -d --scale web=3

# Выполнение команды в контейнере
docker-compose exec web bash

# Просмотр конфигурации
docker-compose config

# Валидация конфигурации
docker-compose config --quiet
Docker. Docker-compose
ИППРПО

Практический пример 1: Веб-приложение с БД

version: '3.8'

services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - api
      
  api:
    build: ./api
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgresql://user:password@db:5432/myapp
    depends_on:
      - db
      
  db:
    image: postgres:15
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:
Docker. Docker-compose
ИППРПО

Практический пример 2: WordPress

version: '3.8'

services:
  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wordpress_data:/var/www/html
    depends_on:
      - db
      
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    volumes:
      - db_data:/var/lib/mysql

volumes:
  wordpress_data:
  db_data:
Docker. Docker-compose
ИППРПО

Практический пример 3: Микросервисы

version: '3.8'

services:
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
    environment:
      - REACT_APP_API_URL=http://api:5000
      
  api:
    build: ./api
    ports:
      - "5000:5000"
    environment:
      - DATABASE_URL=postgresql://user:pass@db:5432/myapp
      - REDIS_URL=redis://redis:6379
    depends_on:
      - db
      - redis
      
  db:
    image: postgres:15
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    volumes:
      - db_data:/var/lib/postgresql/data
      
  redis:
    image: redis:alpine
    volumes:
      - redis_data:/data

volumes:
  db_data:
  redis_data:
Docker. Docker-compose
ИППРПО

Масштабирование сервисов

# Масштабирование веб-сервера до 3 экземпляров
docker-compose up -d --scale web=3

# Масштабирование API-сервиса
docker-compose up -d --scale api=5

# Просмотр запущенных контейнеров
docker-compose ps
Docker. Docker-compose
ИППРПО

Переменные окружения и профили

docker-compose.yml с профилями:

services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
      
  dev-tools:
    image: adminer
    ports:
      - "8080:8080"
    profiles:
      - dev
      
  monitoring:
    image: prometheus
    profiles:
      - monitoring

Запуск с профилями:

docker-compose --profile dev up
docker-compose --profile monitoring up
Docker. Docker-compose
ИППРПО

Переопределение конфигурации

docker-compose.override.yml:

services:
  web:
    ports:
      - "8080:80"    # Переопределение порта
      
  api:
    environment:
      - DEBUG=true   # Добавление переменных
    volumes:
      - ./src:/app   # Монтирование исходников

Запуск с переопределением:

docker-compose up    # Автоматически использует override
Docker. Docker-compose
ИППРПО

Лучшие практики

  1. Используйте конкретные версии образов вместо latest
  2. Разделяйте конфигурации для разных окружений
  3. Используйте переменные окружения для чувствительных данных
  4. Оптимизируйте Dockerfile для ускорения сборки
  5. Используйте health checks для критичных сервисов
  6. Монтируйте исходники только в development-окружении
  7. Используйте внешние тома для данных, которые нужно сохранить
Docker. Docker-compose
ИППРПО

Безопасность

services:
  api:
    image: node:18
    user: "1000:1000"    # Запуск от непривилегированного пользователя
    read_only: true      # Только чтение файловой системы
    tmpfs:
      - /tmp:noexec,nosuid,size=100m
    
  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password  # Загрузка из файла
    secrets:
      - db_password

secrets:
  db_password:
    file: ./db_password.txt
Docker. Docker-compose
ИППРПО

Отладка и мониторинг

# Просмотр логов всех сервисов
docker-compose logs -f

# Просмотр логов конкретного сервиса
docker-compose logs -f api

# Выполнение команды в контейнере
docker-compose exec db psql -U user -d myapp

# Просмотр использования ресурсов
docker stats

# Проверка конфигурации
docker-compose config
Docker. Docker-compose
ИППРПО

Docker Compose V2

Новая версия Docker Compose (V2) предоставляет улучшенную производительность и новые возможности:

# Старая команда
docker-compose up

# Новая команда (V2)
docker compose up

# Преимущества V2:
# - Лучшая производительность
# - Поддержка новых функций
# - Интеграция с Docker CLI
Docker. Docker-compose
ИППРПО

Итоги

Docker Compose — мощный инструмент для управления многоконтейнерными приложениями:

  • Упрощает развертывание сложных приложений
  • Обеспечивает воспроизводимость окружений
  • Поддерживает масштабирование и оркестрацию
  • Интегрируется с CI/CD пайплайнами

Ключ к успеху — понимание структуры docker-compose.yml и следование best practices!

Docker. Docker-compose
ИППРПО

Контрольные вопросы

  1. Зачем нужен Docker Compose и чем он отличается от Docker?
  2. Какие основные секции есть в docker-compose.yml?
  3. Как пробросить порты и переменные окружения?
  4. Что делает команда depends_on?
  5. Как масштабировать сервисы в Docker Compose?
  6. Какие бывают типы томов и когда их использовать?
  7. Как организовать конфигурации для разных окружений?
  8. Какие лучшие практики следует использовать?
Docker. Docker-compose
ИППРПО

Дополнительные материалы

Docker. Docker-compose